#include "request_filter.h"

const int RequestFilter::FIELD_SIZE = 16;

// 请求过滤器
// 检查OJ名称，题目编号，编程语言，代码长度
int RequestFilter::operator() (const char *header,
							   std::map<std::string, OJ*> &map_oj_obj) {
	int i, index;
	char field[4][FIELD_SIZE+10];
	std::map<std::string, OJ*>::iterator it_oj;

	// 检查OJ名称
	for (i = 0, index = 0; i < FIELD_SIZE && header[i]; i++, index++) {
		if (header[i] == '|') 
			return FILTER_OJ_ERROR;
		field[0][index] = header[i];
	}
	field[0][index] = '\0';
	if (index >= FIELD_SIZE ||
		map_oj_obj.find(strlower(field[0])) == map_oj_obj.end())
		return FILTER_OJ_ERROR; // 不以'\0'结尾或不支持该OJ

	// 检查题目编号
	for (i = 0; i < FIELD_SIZE && header[FIELD_SIZE+i]; i++) {
		if (header[FIELD_SIZE+i] == '|') 
			return FILTER_PROBLEM_ERROR;
	}
	if (i >= FIELD_SIZE) 
		return FILTER_PROBLEM_ERROR;

	// 检查编程语言
	OJ *oj = map_oj_obj[field[0]];
	for (i = 0, index = 0; i < FIELD_SIZE && header[2*FIELD_SIZE+i]; i++, index++) {
		if (header[2 * FIELD_SIZE + i] == '|') 
			return FILTER_LANGUAGE_ERROR;
		field[1][index] = header[2 * FIELD_SIZE + i];
	}
	field[1][index] = '\0';
	if (index >= FIELD_SIZE ||
		!oj->check_language(strlower(field[1])))
		return FILTER_LANGUAGE_ERROR; // 不以'\0'结尾或该OJ不支持该编程语言

	// 检查代码长度
	for (i = 0, index = 0; i < FIELD_SIZE && header[3*FIELD_SIZE+i]; i++, index++) {
		if (header[3 * FIELD_SIZE + i] == '|') 
			return FILTER_CODE_LENGTH_ERROR;
		field[2][index] = header[3*FIELD_SIZE+i];
	}
	field[2][index] = '\0';
	if (index >= FIELD_SIZE || !is_positive_integer(field[2]) ||
		atoi(field[2]) < MIN_CODE_LENGTH || atoi(field[2]) > MAX_CODE_LENGTH)
		return FILTER_CODE_LENGTH_ERROR; // 不以'\0'结尾或不是正整数，或长度过小，或长度过大

	return FILTER_OK;
}


